﻿namespace Lesson_3_二堆数组
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("二维数组");

            #region 知识点一
            //二堆数组 是使用俩个下标（索引）来确定元素的数组
            //俩个下标可以理解成行和列，行表示第几行，列表示第几列
            //比如矩阵
            // 1 2 3
            // 4 5 6
            // 行数为2，列数为3
            //可以用二维数组 int[2,3] 来表示
            //好比 俩行 三列的数据集合
            #endregion

            #region 知识点二 二堆数组变量名
            //变量类型[,] 二维数组变量名
            int[,] arr; //申明过后 会在后面进行初始化

            //变量类型[,] 二维数组变量名 = new 变量类型[行数,列数];
            int[,] arr2 = new int[2, 3];

            //变量类型[,] 二维数组变量名 = new 变量类型[行数,列数] { {0行元素1,0行元素2,0行元素3...}, {1行元素1,1行元素2,1行元素3...} };
            int[,] arr3 = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };

            //变量类型[,] 二维数组变量名 = new 变量类型[,] { {0行元素1,0行元素2,0行元素3...}, {1行元素1,1行元素2,1行元素3},... } };
            int[,] arr4 = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };

            //变量类型[,] 二维数组变量名 = { {0行元素1,0行元素2,0行元素3...}, {1行元素1,1行元素2,1行元素3...} };
            int[,] arr5 = { { 1, 2, 3 }, { 4, 5, 6 } };
            #endregion

            #region 知识点三 二维数组的访问
            int[,] array = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };

            //1.二维数组的长度
            //我们要获取 二维数组的行数和列数分别时多长，可以使用GetLength() 方法
            //得到行数：GetLength(0)
            Console.WriteLine("二维数组的行数：{0}", array.GetLength(0));
            //得到列数：GetLength(1)
            Console.WriteLine("二维数组的列数：{0}", array.GetLength(1));

            //2.获取二维数组中的元素
            //注意：第一个元素的索引是0 最后一个元素的索引是行数*列数-1
            Console.WriteLine(array[0, 1]);
            Console.WriteLine(array[1, 2]);

            //3.修改二维数组中的元素
            array[0, 0] = 99;
            Console.WriteLine(array[0, 0]);

            //4.遍历二维数组
            //遍历二维数组的一般方法是使用for循环
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    Console.Write(array[i, j] + " ");
                }
                Console.WriteLine();
            }
            //5.增加数组元素
            //数组申明初始化过后 就不能再原有的基础上增加元素
            int[,] array2 = new int[3, 3];
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    array2[i, j] = array[i, j];
                }
            }
            array = array2;
            array[2, 0] = 7;
            array[2, 1] = 8;
            array[2, 2] = 9;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    Console.WriteLine(array[i, j]);
                }
            }
            #endregion

            //总结
            //概念：同一变量类型的 行列数据集合
            //所有的变量类型都可以申明为 二维数组
            //游戏中一般用来储存 矩阵 在控制台小游戏中可以用来绘制地图

            #region 练习题
            int[,] array1 = new int[5, 5] { {  0, 0, 0 ,0 , 0},
                                            {  0, 0, 0 ,0 , 0},
                                            {  0, 0, 1 ,0 , 0},
                                            {  0, 0, 0 ,0 , 0},
                                            {  0, 0, 0 ,0 , 0}};
            bool[] hang = new bool[5];
            bool[] lie = new bool[5];
            for (int i = 0; i < array1.GetLength(0); i++)
            {
                for (int j = 0; j < array1.GetLength(1); j++)
                {
                    if (array1[i, j] == 1)
                    {
                        hang[i] = true;
                        lie[j] = true;
                    }
                    Console.Write(array1[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine("**********************************");
            for (int i = 0; i < array1.GetLength(0); i++)
            {
                for (int j = 0; j < array1.GetLength(1); j++)
                {
                    //满足行列的标识 时ture 就变一
                    if (hang[i] || lie[j])
                    {
                        array1[i, j] = 1;
                    }
                    Console.Write(array1[i, j] + " ");
                }
                Console.WriteLine();
            }
            
            #endregion
        }
    }
}
